The purpose of this document is to compute additional “calculated variables” that require unblinded data, and to save the updated MultiAssayExperiment object for downstream analyses.
First, to assess general quality of collected swabs, we visualize the qPCR 16S results across visits and participants. For each participant, the median number of 16S copies per swab (log₁₀-transformed) is displayed as a heatmap, with participants on the y-axis and visit codes on the x-axis. The plot is stratified by study arm and site using nested facets.
We generate heatmaps of qPCR results for each study arm. For every participant and visit, the median number of copies per swab for each LBP strain is shown, with strain identity on the y-axis and visit code on the x-axis.
We plot longitudinal qPCR measurements for each participant and strain, stratified by study arm, site, and participant. The x-axis shows study days and the y-axis the median copies per swab (log₁₀ scale). Each line represents one LBP strain, with color indicating strain identity. Shaded background areas indicate treatment periods: red for oral metronidazole and yellow for LBP dosing. A dashed horizontal line marks the 10⁵ copies/swab threshold.
We summarize the qPCR results to compute total LBP copies per swab and the number of detected LBP strains for each participant at each visit. We also calculate the proportion of detected LBP strains among those expected based on the study arm.
df_summ |>filter(randomized) |>ggplot() +aes(x = visit_code, y = pid, fill = p_detected) + ggh4x::facet_nested(arm + site ~ ., scales ="free_y", space ="free_y") +geom_tile() +scale_fill_viridis_c("proportion of LBP strains\ndetected among expected", option ="G" ) + ggnewscale::new_scale_fill() +geom_point(data = df_summ |>filter(randomized, study_product ==1),aes(shape = returned_used_applicators, fill = p_pos_or_undet_applicator), size =2, col ="white" ) +scale_fill_gradient2("Prop. pos. or ?\napplicators",high ="black", mid ="green", low ="yellow", midpoint =0.5, breaks =c(0, 1/2, 1) ) +scale_shape_manual("Returned\napplicators", values =c(23, 21), guide =guide_legend(override.aes =list(color ="black", fill ="black")) ) +theme(axis.text.x =element_text(angle =90, hjust =1, vjust =0.5),legend.position ="bottom", legend.direction ="horizontal" )
Exposed by qPCR
For each study day, we define “effective exposure by qPCR” as having at least 50% of expected LBP strains detected by qPCR and a total LBP load exceeding 10⁷ copies per swab.